package com.h.ioc.controller;

import com.h.ioc.component.UserComponent;
import com.h.ioc.model.Student;
import com.h.ioc.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

// 可以进行更改类名，直接更改其余的四个注解一样
@Controller("HelloController")
public class HelloController {

    // DI注入有三种方式
    // 1：属性注入
    // 从 Spring 中根据类型获取对象，并且给userService赋值
//    @Autowired
//    private UserService userService;
//    @Autowired
//    private UserComponent userComponent;

    // 2：构造方法注入
    // 如果只有一个构造方法的话，那么@Autowired可以省略
    // 但是入过出现多个方法的话而且没有@Autowired的话，那么默认的构造方法是无参构造
    // 想要指定构造方法的话呢，我们需要使用@Autowired来指定构造方法
//    private UserService userService;
//    private UserComponent userComponent;
//
//    public HelloController() {
//    }
//
//    public HelloController(UserService userService) {
//        this.userService = userService;
//    }
//    @Autowired
//    public HelloController(UserService userService, UserComponent userComponent) {
//        this.userService = userService;
//        this.userComponent = userComponent;
//    }

    // 3：Setter方法注入
    // 同样需要使用@Autowired来指定
//    private UserService userService;
//    private UserComponent userComponent;
//
//    @Autowired
//    public void setUserService(UserService userService) {
//        this.userService = userService;
//    }
//    @Autowired
//    public void setUserComponent(UserComponent userComponent) {
//        this.userComponent = userComponent;
//    }

    // 这个@Autowired存在一些问题，当出现多个相同类型要注入的时候呢，就出现问题了
    // 我们可以使用三个 注解进行解决这个问题
    // 1：@Primary 这个注解放在要注入的的类的上面，表示默认为这个类
//    @Autowired
//    private Student s1;

    // 2：@Qualifier 这个注解是要配合@Autowired使用的，来指定bean名称
    // 这个注解一般是使用在参数中的
//    @Qualifier("s2")
//    @Autowired
//    private Student s1;

    // 3：@Resource 这个注解是直接指定bean的名称的
    // 一般使用这个注解
    @Resource(name = "s2")
    private Student s1;


    public void print() {
        System.out.println("do controller");
//        System.out.println(userService);
//        userService.print();
//
//        System.out.println(userComponent);
//        userComponent.print();
        System.out.println(s1);
    }
}
